package pe.gob.mininter.dirandro.vaadin.panel.util;

import java.util.List;

import org.apache.log4j.Logger;

import pe.gob.mininter.dirandro.model.Arma;
import pe.gob.mininter.dirandro.model.ModeloMarca;
import pe.gob.mininter.dirandro.service.ArmaService;
import pe.gob.mininter.dirandro.service.ModeloMarcaService;
import pe.gob.mininter.dirandro.util.BeanValidar;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.panel.parte.PanelRegistroParteArma;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;


public class PanelAgregarArmas extends CustomComponent  implements ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlBody;
	@AutoGenerated
	private HorizontalLayout pnl6;
	@AutoGenerated
	private Button btnCancelar;
	@AutoGenerated
	private Button btnGrabar;
	@AutoGenerated
	private HorizontalLayout pnl3;
	@AutoGenerated
	private TextField txtInternamiento;
	@AutoGenerated
	private ComboBoxLOVS cmbCalibre;
	@AutoGenerated
	private HorizontalLayout pnl2;
	@AutoGenerated
	private TextField txtSerie;
	@AutoGenerated
	private ComboBoxLOVS cmbSerieEstado;
	@AutoGenerated
	private HorizontalLayout pnl1;
	@AutoGenerated
	private ComboBox cmbModelo;
	@AutoGenerated
	private ComboBox cmbMarca;
	@AutoGenerated
	private ComboBox cmbClasificacion;
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private static final Logger logger = Logger.getLogger(PanelAgregarArmas.class);
	private PanelRegistroParteArma padre;
	private ArmaService armaService;
	private ModeloMarcaService modeloMarcaService;
	private List<ModeloMarca> lstClasificacionArma;
	private List<ModeloMarca> lstMarcasArma;
	private List<ModeloMarca> lstModelosArma;
	private Arma arma;
	
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */	
	public PanelAgregarArmas() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		armaService = Injector.obtenerServicio(ArmaService.class);
		modeloMarcaService  = Injector.obtenerServicio(ModeloMarcaService.class);
		postConstruct();
		debugId();
	}
	
	public void setPadre(PanelRegistroParteArma padre) {
		this.padre = padre;
	}
	
	private void debugId(){
		
	}
	
	public void postConstruct() {
		
		lstClasificacionArma = modeloMarcaService.buscarHijos(new ModeloMarca(Constante.MODELO_MARCA.ARMAS.TIPOS));
		cmbCalibre.setInputPrompt("Calibre");
		cmbCalibre.setCodigoLista(Constante.LISTA.CODIGO.TIPO_CALIBRE);
		cmbSerieEstado.setInputPrompt("Estado de la Serie");
		cmbSerieEstado.setRequired(true);
		cmbSerieEstado.setCodigoLista(Constante.LISTA.CODIGO.ARMA_ESTADO_SERIE);
		cmbClasificacion.setInputPrompt("Clasificacion de armas");
		cmbClasificacion.setItemCaptionPropertyId("nombre");
		cmbClasificacion.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,  lstClasificacionArma));
		cmbClasificacion.setImmediate(true);
		cmbClasificacion.addListener(new Property.ValueChangeListener() {            
			private static final long serialVersionUID = 1L;
			@Override
            public void valueChange(ValueChangeEvent event) {				 
				lstMarcasArma = modeloMarcaService.buscarHijos((ModeloMarca)cmbClasificacion.getValue());
				cmbMarca.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,lstMarcasArma));
            }
        });
		
		cmbMarca.setInputPrompt("Marcas");
		cmbMarca.setItemCaptionPropertyId("nombre");
		cmbMarca.setImmediate(true);
		cmbMarca.addListener(new Property.ValueChangeListener() {            
			private static final long serialVersionUID = 1L;
			@Override
            public void valueChange(ValueChangeEvent event) {				 
				lstModelosArma = modeloMarcaService.buscarHijos((ModeloMarca)cmbMarca.getValue());
				cmbModelo.setContainerDataSource(new BeanItemContainer<ModeloMarca>(ModeloMarca.class,lstModelosArma));
            }
        });
		
		cmbModelo.setInputPrompt("Marcas");
		cmbModelo.setItemCaptionPropertyId("nombre");
		
		limpiar();
		btnGrabar.addListener(this);
		btnCancelar.addListener(this);
	}
	
	public void limpiar(){
		arma=new Arma();
		txtInternamiento.setValue("");
		txtSerie.setValue("");
		
		cmbCalibre.select(null);
		cmbClasificacion.select(null);
		cmbMarca.select(null);
		cmbModelo.select(null);
		cmbSerieEstado.select(null);
		
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(	event.getButton().equals(btnGrabar)  ){
			
			arma.setCalibre(cmbCalibre.getValor());
			arma.setEstadoSerie(cmbSerieEstado.getValor());
			arma.setInternamiento(HarecUtil.nullToEmpty(txtInternamiento.getValue()));
			arma.setModelo((ModeloMarca)cmbModelo.getValue());
			arma.setNroSerie(HarecUtil.nullToEmpty(txtSerie.getValue()));
			
			HarecUtil.validar(getWindow(), arma, new BeanValidar[]{
	        	new BeanValidar("modelo", new Object[]{"Clasificación / Marca / Modelo"}, cmbModelo),					
	        	new BeanValidar("estadoSerie", new Object[]{"Estado de la serie"}, cmbSerieEstado)
	        });
	        
	        logger.debug("grabar arma");
			armaService.crear(arma);
			
			AlertDialog alertDialog = new  AlertDialog("Registro de Arma", "Se ha registrado el arma correctamente", "Aceptar", "400");
			getApplication().getMainWindow().addWindow(alertDialog);
			padre.actualizarArmas(arma);
			getApplication().getMainWindow().removeWindow(getWindow());
			
		}else{
			 getApplication().getMainWindow().removeWindow(getWindow());
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("500px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("500px");
		setHeight("-1px");
		
		// pnlBody
		pnlBody = buildPnlBody();
		mainLayout.addComponent(pnlBody);
		mainLayout.setComponentAlignment(pnlBody, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlBody() {
		// common part: create layout
		pnlBody = new VerticalLayout();
		pnlBody.setImmediate(false);
		pnlBody.setWidth("-1px");
		pnlBody.setHeight("-1px");
		pnlBody.setMargin(true);
		pnlBody.setSpacing(true);
		
		// pnl1
		pnl1 = buildPnl1();
		pnlBody.addComponent(pnl1);
		
		// pnl2
		pnl2 = buildPnl2();
		pnlBody.addComponent(pnl2);
		
		// pnl3
		pnl3 = buildPnl3();
		pnlBody.addComponent(pnl3);
		
		// pnl6
		pnl6 = buildPnl6();
		pnlBody.addComponent(pnl6);
		pnlBody.setComponentAlignment(pnl6, new Alignment(20));
		
		return pnlBody;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl1() {
		// common part: create layout
		pnl1 = new HorizontalLayout();
		pnl1.setImmediate(false);
		pnl1.setWidth("-1px");
		pnl1.setHeight("-1px");
		pnl1.setMargin(false);
		pnl1.setSpacing(true);
		
		// cmbClasificacion
		cmbClasificacion = new ComboBox();
		cmbClasificacion.setCaption("Clasificación");
		cmbClasificacion.setImmediate(false);
		cmbClasificacion.setWidth("100px");
		cmbClasificacion.setHeight("-1px");
		pnl1.addComponent(cmbClasificacion);
		
		// cmbMarca
		cmbMarca = new ComboBox();
		cmbMarca.setCaption("Marca");
		cmbMarca.setImmediate(false);
		cmbMarca.setWidth("-1px");
		cmbMarca.setHeight("-1px");
		pnl1.addComponent(cmbMarca);
		
		// cmbModelo
		cmbModelo = new ComboBox();
		cmbModelo.setCaption("Modelo");
		cmbModelo.setImmediate(false);
		cmbModelo.setWidth("-1px");
		cmbModelo.setHeight("-1px");
		cmbModelo.setRequired(true);
		pnl1.addComponent(cmbModelo);
		
		return pnl1;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl2() {
		// common part: create layout
		pnl2 = new HorizontalLayout();
		pnl2.setImmediate(false);
		pnl2.setWidth("-1px");
		pnl2.setHeight("-1px");
		pnl2.setMargin(false);
		pnl2.setSpacing(true);
		
		// cmbSerieEstado
		cmbSerieEstado = new ComboBoxLOVS();
		cmbSerieEstado.setCaption("Serie Estado");
		cmbSerieEstado.setImmediate(false);
		cmbSerieEstado.setWidth("-1px");
		cmbSerieEstado.setHeight("-1px");
		pnl2.addComponent(cmbSerieEstado);
		
		// txtSerie
		txtSerie = new TextField();
		txtSerie.setCaption("Número de Serie");
		txtSerie.setImmediate(false);
		txtSerie.setWidth("150px");
		txtSerie.setHeight("-1px");
		txtSerie.setInputPrompt("Número de Serie");
		txtSerie.setMaxLength(50);
		pnl2.addComponent(txtSerie);
		
		return pnl2;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl3() {
		// common part: create layout
		pnl3 = new HorizontalLayout();
		pnl3.setImmediate(false);
		pnl3.setWidth("-1px");
		pnl3.setHeight("-1px");
		pnl3.setMargin(false);
		pnl3.setSpacing(true);
		
		// cmbCalibre
		cmbCalibre = new ComboBoxLOVS();
		cmbCalibre.setCaption("Calibre");
		cmbCalibre.setImmediate(false);
		cmbCalibre.setWidth("-1px");
		cmbCalibre.setHeight("-1px");
		pnl3.addComponent(cmbCalibre);
		
		// txtInternamiento
		txtInternamiento = new TextField();
		txtInternamiento.setCaption("Internamiento");
		txtInternamiento.setImmediate(false);
		txtInternamiento.setWidth("150px");
		txtInternamiento.setHeight("-1px");
		txtInternamiento.setInputPrompt("Internamiento");
		txtInternamiento.setMaxLength(50);
		pnl3.addComponent(txtInternamiento);
		
		return pnl3;
	}

	@AutoGenerated
	private HorizontalLayout buildPnl6() {
		// common part: create layout
		pnl6 = new HorizontalLayout();
		pnl6.setImmediate(false);
		pnl6.setWidth("-1px");
		pnl6.setHeight("-1px");
		pnl6.setMargin(false);
		pnl6.setSpacing(true);
		
		// btnGrabar
		btnGrabar = new Button();
		btnGrabar.setCaption("Grabar");
		btnGrabar.setImmediate(true);
		btnGrabar.setWidth("-1px");
		btnGrabar.setHeight("-1px");
		pnl6.addComponent(btnGrabar);
		
		// btnCancelar
		btnCancelar = new Button();
		btnCancelar.setCaption("Cancelar");
		btnCancelar.setImmediate(true);
		btnCancelar.setWidth("-1px");
		btnCancelar.setHeight("-1px");
		pnl6.addComponent(btnCancelar);
		
		return pnl6;
	}
 

}